package com.woniuxy.fourthfactory;

import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * @Author: 马宇航
 * @Todo: 第四类工厂模式，模仿Spring底层的实现！
 * @DateTime: 22/03/23/0023 下午 3:24
 * @Component: 成都蜗牛学苑
 **/
public class BeanFactory {
    //静态代码块，让这个工厂在new出来的时候，就直接去读取配置文件然后实例化全部对象！
    //封装！等会讲！
    //定义一个map的属性，用来封装实例化好的对象！static是在加载的时候 就会定义好，是跟着Class类对象走的！
    static Map allObject;
    static {
        //1.创建properties对象来获取配置文件
        Properties properties = new Properties();
        allObject = new HashMap<>();
        //2.加载配置文件
        try {
            properties.load(BeanFactory.class.getClassLoader().getResourceAsStream("spring.properties"));
            //3.获取配置文件中所有的key和value
            Enumeration<?> enumeration = properties.propertyNames();
            while (enumeration.hasMoreElements()) {
                //获取key元素，并转换成字符串
                String key = enumeration.nextElement()+"";
                System.out.println(key+"；keys");
                //通过key获取的全限定类名
                String property = properties.getProperty(key);
                //通过反射创建对象实例
                Object o = Class.forName(property).newInstance();
                allObject.put(key,o);
            }
        } catch (IOException | ClassNotFoundException | InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }
    /**
     * TODO 封装！隐藏具体的实现，开放一个公有的方法。空调隐藏具体的实现细节，开放一个遥控器给人使用！
     * ChangeLog : 1. 创建 (22/03/23/0023 下午 3:42 [马宇航]);
     * @param beanName 传入类名首字母小写的字符串即可
     * @return java.lang.Object
    */
    public Object getBean(String beanName){
        return allObject.get(beanName);
    }
}
